//导入数据库模块
const db=require('../db/index')
//导入密码加密包
const bcryptjs=require('bcryptjs')
//导入jwt包
const jwt=require('jsonwebtoken')
//导入全局配置文件
const config=require('../config')

const {isEmail,isPwd,stringCheck} =require("../utils/regtest")
//注册新用户的处理函数
exports.regUser=(req,res)=>{
    //获取客户端提交到服务器的信息
    const userinfo=req.fields
    if(!isEmail(userinfo.email))return res.R("邮箱格式错误！")
    if(!stringCheck(req.fields.username))return res.R("用户名必须是三位字母或汉字或下划线或数字的单一形式或不同组合！")
    if(!isPwd(req.fields.password))return res.R("密码以字母开头，长度在6-12之间，只能包含字符、数字和下划线。")
   
    const hasAccount="select * from user where username = ?"
    db.query(hasAccount,[userinfo.username],(err,result)=>{
        if(err){
            return res.R(err)
        }
    
        if(result.length>0){
            return res.R("用户名被占用!")
        }
        //使用bcryptjs加密
        userinfo.password=bcryptjs.hashSync(userinfo.password,10)
        //随机生成12生肖头像
        var numAvatar=Math.floor(Math.random()*9)
        
        var strAvatar=numAvatar>=10?(numAvatar.toString()):("0"+numAvatar.toString())
        userinfo.avatar="https://echoes-101.oss-cn-hangzhou.aliyuncs.com/vihanblog/NO.00"+strAvatar+".png"

        const insertSql="insert into user set ?"
        //插入
        db.query(insertSql,{username:userinfo.username,password:userinfo.password,email:userinfo.email,role:"user",avatar:userinfo.avatar},(err,result)=>{
            //判断语句是否执行成功
            if(err){
                return res.send({status : 400, message: err.message})
            }
            if(result.affectedRows!=1){
                return res.R("注册用户失败，请稍后再试")
            }
            return res.R("注册成功！",200)
        })
    })
}

exports.logUser=(req,res)=>{

    //接收表单数据
    const userinfo=req.fields
    if(!stringCheck(req.fields.username))return res.R("用户名必须是三位字母或汉字或下划线或数字的单一形式或不同组合！")
    if(!isPwd(req.fields.password))return res.R("密码以字母开头，长度在6-12之间，只能包含字符、数字和下划线。")
    //定义sql语句
    const sql=`select * from user where username = ?`
    //执行SQL语句，根据用户名查询用户信息
    db.query(sql,userinfo.username,(err,result)=>{
        //查询失败
        if(err){
            return err.R(err.message)
        }
        if(result.length!=1) return res.R("登录失败！")

        const isMatch=bcryptjs.compareSync(userinfo.password,result[0].password)
        if(!isMatch) return res.R("账户名或密码错误！")
        //TODO： 在服务器端生成token字符串
        const user={...result[0],password:"",email:"",avatar:"",}
        //对用户信息进行加密
        const tokenStr=jwt.sign(user,config.jwtSecretKey,{expiresIn:config.expiresIn})
        //将token响应给客户端
        res.send({
            status:200,
            message:"登录成功!",
            token:'Bearer '+tokenStr,
        })
    })
 
}